#pragma once
#include <spdlog/spdlog.h>                      // spdlog主头文件
#include <spdlog/sinks/stdout_color_sinks.h>    // 支持彩色控制台输出的日志器
#include <spdlog/sinks/basic_file_sink.h>       // 支持文件输出的日志器
#include <spdlog/async.h>                       // 支持异步日志功能
#include <iostream>                             // 标准输入输出流

// 全局日志器指针，供整个程序使用
std::shared_ptr<spdlog::logger> g_default_logger;

/**
 * @brief 初始化全局日志器
 * @param mode 运行模式：false - 调试模式（标准输出）；true - 发布模式（文件输出）
 * @param file 发布模式下日志文件的路径
 * @param level 发布模式下日志的输出等级
 */
namespace mag
{
    void init_logger(bool mode, const std::string &file, int32_t level)
{
    if (mode == false) {
        // 调试模式
        // 创建一个标准输出的彩色日志器（console sink），便于实时调试
        g_default_logger = spdlog::stdout_color_mt("default-logger");

        // 设置日志输出等级为 trace（最低等级），输出所有日志
        g_default_logger->set_level(spdlog::level::level_enum::trace);

        // 设置自动刷新等级为 trace，确保每次输出的日志都实时刷新
        g_default_logger->flush_on(spdlog::level::level_enum::trace);
    } else {
        // 发布模式
        // 创建一个文件日志器（file sink），将日志输出到指定文件
        g_default_logger = spdlog::basic_logger_mt("default-logger", file);

        // 根据参数设置日志输出等级（如 info, warn 等）
        g_default_logger->set_level((spdlog::level::level_enum)level);

        // 设置自动刷新等级为指定的等级，确保高等级日志实时写入文件
        g_default_logger->flush_on((spdlog::level::level_enum)level);
    }

    // 设置日志输出格式：包含日志器名称、时间、线程号、日志等级和日志内容
    g_default_logger->set_pattern("[%n][%H:%M:%S][%t][%-8l]%v");
}
}


// 宏定义日志输出方法，每个日志级别对应一个宏
// 格式为：[文件名:行号] 日志内容
#define LOG_TRACE(format, ...) g_default_logger->trace(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_DEBUG(format, ...) g_default_logger->debug(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_INFO(format, ...) g_default_logger->info(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_WARN(format, ...) g_default_logger->warn(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_ERROR(format, ...) g_default_logger->error(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_FATAL(format, ...) g_default_logger->critical(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
